package weiyao.xinxidasai.Utils.Encryption.Chaos;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class LogisticMap {
    private double r;       // 混沌参数
    private double x0;      // 初始值
    private long iterations; // 迭代次数（改为 long 类型）

    // 无参构造方法：生成随机唯一参数
    public LogisticMap() {
        Random rand = new Random();
        this.r = 3.8 + (0.2 * rand.nextDouble()); // r ∈ [3.8, 4.0]
        this.x0 = 0.2 + (0.6 * rand.nextDouble()); // x0 ∈ [0.2, 0.8]
        this.iterations = 100_000L + rand.nextInt(400_001); // 100k-500k
    }

    // 带参构造方法（用于从数据库加载参数）
    public LogisticMap(double r, double x0, long iterations) {
        this.r = r;
        this.x0 = x0;
        this.iterations = iterations;
    }

    // 获取参数（用于存储到数据库）
    public double[] getParams() {
        return new double[]{r, x0, (double)iterations}; // 将 long 转换为 double 存储
    }



    // 生成密钥流（使用对象自身参数）
    public List<Byte> generateKeyStream() {
        List<Byte> keyStream = new ArrayList<>();
        double x = x0;

        // 跳过前1000次迭代
        for (long i = 0; i < 1000; i++) { // 使用 long 类型
            x = r * x * (1 - x);
        }

        // 生成密钥流 - 使用 long 类型循环
        for (long i = 0; i < iterations; i++) {
            x = r * x * (1 - x);
            byte keyByte = (byte) (Math.round(x * 255));
            keyStream.add(keyByte);
        }

        return keyStream;
    }



}